// 给定两个有序整数数组 nums1 和 nums2，将 nums2 合并到 nums1 中，使得 num1 成为一个有序数组。

// 说明:

// 初始化 nums1 和 nums2 的元素数量分别为 m 和 n。
// 你可以假设 nums1 有足够的空间（空间大小大于或等于 m + n）来保存 nums2 中的元素。
// 示例:

// 输入:
// nums1 = [1,2,3,0,0,0], m = 3
// nums2 = [2,5,6],       n = 3

// 输出: [1,2,2,3,5,6]

#include <vector>

using namespace std;

class Solution {
public:
    void merge(vector<int>& nums1, int m, vector<int>& nums2, int n) {
        int count = m + n -1;
        --m;
        --n;
        while(m >= 0 && n >=0){
            nums1[count--] = nums1[m] > nums2[n] ? nums1[m--] : nums2[n--];
        }
        while (n >= 0){
            nums1[count--] = nums2[n--];
        }
    }
};

class Solution {
public:
    void merge(vector<int>& nums1, int m, vector<int>& nums2, int n) {
        vector<int> res(m + n, 0);
        int i{0};
        int j{0};
        int index{0};
        while (i < m && j < n) {
            if (nums1[i] < nums2[j]) {
                res[index] = nums1[i++];
            } else {
                res[index] = nums2[j++];
            }
            ++index;
        }
        while (i < m) {
            res[index++] = nums1[i++];
        }
        while (j < n) {
            res[index++] = nums2[j++];
        }
        nums1 = res;
    }
};

// 从后往前遍历，不用临时数组
class Solution {
public:
    void merge(vector<int>& nums1, int m, vector<int>& nums2, int n) {
        int index{m + n - 1};
        int i{m - 1};
        int j{n - 1};
        while (i >= 0 && j >= 0) {
            if (nums1[i] > nums2[j]) {
                nums1[index--] = nums1[i--];
            } else {
                nums1[index--] = nums2[j--];
            }
        }
        // nums2可能还有没有遍历到的数字
        while (j >= 0) {
            nums1[index--] = nums2[j--];
        }
    }
};